#!/bin/bash

# 脚本使用说明
usage() {
    echo "❌ 最新3.0版本不可用！！！"
    echo "用法: $0 [并发连接数] [Python版本]"
    echo "  并发连接数: 可选，默认为 1024"
    echo "  Python版本: 可选，默认为自动检测文件对应版本 (如: 3.8)"
    echo "示例:"
    echo "  $0             # 使用默认1024连接数, 自动检测Python版本"
    echo "  $0 2048        # 设置2048连接数, 自动检测Python版本"
    echo "  $0 2048 3.8    # 设置2048连接数, 指定Python 3.8版本"
    exit 1
}

# 显示帮助信息
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    usage
fi

BASE_DIR="/usr/local/openvpn_as/lib/python"
UNLOCK_DIR="${BASE_DIR}/unlock_license"

# 参数验证
if [ -n "$1" ] && ! [[ "$1" =~ ^[0-9]+$ ]]; then
    echo "错误: 并发连接数必须是数字"
    usage
fi

if [ -n "$2" ] && ! [[ "$2" =~ ^[0-9]+\.[0-9]+$ ]]; then
    echo "错误: Python版本格式不正确，应为 x.y (如: 3.8)"
    usage
fi

echo "=== OpenVPN AS 许可证解锁脚本 ==="
echo ""

# 切换到安全目录，防止删除当前工作目录报错
SAFE_DIR="/tmp"
cd "$SAFE_DIR" || exit 1

# 检查 BASE_DIR 是否存在
if [ ! -d "$BASE_DIR" ]; then
    echo "错误: 目录 $BASE_DIR 不存在，请检查OpenVPN AS是否已安装"
    exit 1
fi

echo "✓ OpenVPN AS 安装目录检测通过"

# 检查 zip/unzip 是否安装
for cmd in unzip zip; do
    if ! type "$cmd" >/dev/null 2>&1; then
        echo "⚠️  $cmd 未安装，尝试安装..."
        if type apt-get >/dev/null 2>&1; then
            sudo apt-get update -qq
            sudo apt-get install -y "$cmd"
            echo "✓ $cmd 安装成功"
        elif type yum >/dev/null 2>&1; then
            sudo yum install -y "$cmd"
            echo "✓ $cmd 安装成功"
        else
            echo "❌ 无法自动安装 $cmd，请手动安装后重试"
            exit 1
        fi
    else
        echo "✓ $cmd 已安装: $(command -v $cmd)"
    fi
done

# 如果传入第二个参数就使用该版本，否则自动查找最新 egg 文件
if [ -n "$2" ]; then
    PY_VER="$2"
    EGG_FILE="pyovpn-2.0-py${PY_VER}.egg"
    echo "📝 使用指定Python版本: $PY_VER"
else
    # 自动查找 pyovpn-*.egg 文件
    EGG_FILE=$(ls "${BASE_DIR}"/pyovpn-2.0-py*.egg 2>/dev/null | sort -V | tail -n1 | xargs -n1 basename)
    if [ -z "$EGG_FILE" ]; then
        echo "❌ 未找到 pyovpn-*.egg 文件，请检查OpenVPN AS安装"
        exit 1
    fi
    # 从文件名中提取版本号
    PY_VER=$(echo "$EGG_FILE" | grep -oP 'py\K[0-9]+\.[0-9]+')
    echo "🔍 自动检测到Python版本: $PY_VER"
fi

echo "📦 目标文件: $EGG_FILE"

# 删除旧的 unlock_license 目录（如果存在）
if [ -d "$UNLOCK_DIR" ]; then
    echo "🗑️  清理旧的解锁目录..."
    rm -rf "$UNLOCK_DIR"
fi

# 存在备份文件则先恢复，保证每次执行都是原来的文件
if [ -f "${BASE_DIR}/${EGG_FILE}.bak" ]; then
    echo "↩️  恢复已存在的备份文件..."
    mv "${BASE_DIR}/${EGG_FILE}.bak" "${BASE_DIR}/${EGG_FILE}"
    echo "✓ 备份文件恢复完成"
fi

# 创建解锁目录
mkdir -p "$UNLOCK_DIR"
echo "✓ 创建解锁目录: $UNLOCK_DIR"

# 备份 egg 文件
if [ -f "${BASE_DIR}/${EGG_FILE}" ]; then
    echo "📋 备份原始文件..."
    cp "${BASE_DIR}/${EGG_FILE}" "${BASE_DIR}/${EGG_FILE}.bak"
    cp "${BASE_DIR}/${EGG_FILE}" "${UNLOCK_DIR}/${EGG_FILE}"
    echo "✓ 文件备份完成"
else
    echo "❌ 文件 ${BASE_DIR}/${EGG_FILE} 不存在，退出脚本"
    exit 1
fi

# 解压 egg
cd "$UNLOCK_DIR" || exit
echo "📦 解压egg文件..."
unzip -q "$EGG_FILE"
echo "✓ 文件解压完成"

lic_path="./pyovpn/lic"

# 重命名 uprop.pyc
if [ -f "${lic_path}/uprop.pyc" ]; then
    echo "🔄 重命名 uprop.pyc..."
    mv "${lic_path}/uprop.pyc" "${lic_path}/uprop2.pyc"
    echo "✓ uprop.pyc -> uprop2.pyc 重命名完成"
else
    echo "⚠️  文件 ${lic_path}/uprop.pyc 不存在，跳过重命名"
fi

# 生成新的 uprop.py
CONCURRENT_CONNECTIONS=${1:-1024}
echo "⚙️  设置并发连接数: $CONCURRENT_CONNECTIONS"
echo "📝 生成新的 uprop.py 文件..."
cat > "${lic_path}/uprop.py" <<EOF
from pyovpn.lic import uprop2

# 保存原始方法
_old_figure = uprop2.UsageProperties.figure

def new_figure(self, licdict):
    ret = _old_figure(self, licdict)
    ret['concurrent_connections'] = ${CONCURRENT_CONNECTIONS}
    return ret

# 替换方法
uprop2.UsageProperties.figure = new_figure

# 把 uprop2 里的成员导出到当前命名空间
for name in dir(uprop2):
    if not name.startswith("__"):
        globals()[name] = getattr(uprop2, name)
EOF

# 编译
echo "🔨 编译新的 uprop.py..."
# 编译 uprop.py
if python3 -O -m compileall "${lic_path}/uprop.py"; then
    echo "✓ 编译完成，检查 pyc 文件..."
    # 使用 find 查找 __pycache__ 下的 uprop.*.pyc 文件
    PYC_FILE=$(find "${lic_path}/__pycache__" -maxdepth 1 -name 'uprop.*.pyc' | head -n 1)
    if [ -n "$PYC_FILE" ]; then
        mv "$PYC_FILE" "${lic_path}/uprop.pyc"
        echo "✓ pyc 文件已处理为 uprop.pyc"
    else
        echo "❌ 未找到编译后的 pyc 文件，编译失败"
        exit 1
    fi
else
    echo "❌ 编译失败"
    exit 1
fi

# 压缩为 egg 文件
cd "$UNLOCK_DIR" || exit
echo "📦 重新打包egg文件..."
zip -rq "${EGG_FILE}" pyovpn EGG-INFO common
echo "✓ 打包完成"
# 覆盖原 egg 文件
mv "${EGG_FILE}" "${BASE_DIR}/${EGG_FILE}"
echo "✓ 文件替换完成"

# 重启服务
echo "🔄 重启OpenVPN AS服务..."
if systemctl restart openvpnas; then
    echo "✅ 服务重启成功"
else
    echo "⚠️  服务重启失败，请手动检查服务状态"
fi

echo ""
echo "🎉 操作完成!"
echo "Python ${PY_VER} 版本的 pyovpn 已成功修改"
echo "并发连接数已设置为: $CONCURRENT_CONNECTIONS"
echo ""
echo "💡 提示: 备份文件保存在 ${BASE_DIR}/${EGG_FILE}.bak"
